package com.atguigu.demo08.controller;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

@RestController
@RequestMapping("/lua")
public class LuaController {
    @Resource
    StringRedisTemplate stringRedisTemplate;
    /*
        读取redis中的number值
            1、如果number不存在 初始化为1
            2、如果存在 执行自增操作

        5w
     */
    @GetMapping("incr")
    public String incr(){
        //如果可以将java中的逻辑和redis操作命令 组装成一个操作交给redis执行  整个业务就具有原子性 一定不会被其他请求插队 数据安全
//        Boolean hasKey = stringRedisTemplate.hasKey("number");
//        if(hasKey){
//            //存在
////            stringRedisTemplate.opsForValue().increment("number");
//            String numberStr = stringRedisTemplate.opsForValue().get("number");
//            int num = Integer.parseInt(numberStr)+1;
//            stringRedisTemplate.opsForValue().set("number" ,num+"" );
//        }else{
//            stringRedisTemplate.opsForValue().set("number" , "1");
//        }
        //利用redis原子性解决数据安全问题
        String script = "if(redis.call('exists' , KEYS[1]) == 0) " +
                "then return redis.call('set' ,KEYS[1] , 1) " +
                "else   redis.call('incr' ,KEYS[1] ) return 'OK' end";
        String result = stringRedisTemplate.execute(new DefaultRedisScript<String>(script,String.class), Arrays.asList("number"));
        System.out.println(result);
        return "success";
        /*
            eval "if(redis.call('exists' , KEYS[1]) == 0) then return redis.call('set' ,KEYS[1] , 1)
            else  return redis.call('incr' ,KEYS[1] )  end" 1 'number'
         */
    }

}
